//
// Created by user on 20-4-15.
//

#include "8259A.h"

void init8259A() {

    // 1. 往 IDT 表设置中断函数
    for (unsigned int i = 32; i < 56; i++) {

        set_intr_gate(i, 2, interrupt[i - 32]);

    }

    printfColor(RED, BLACK, "8259A init \n");

    // 2. 初始化 8259A 主芯片的 ICW1-4 寄存器
    io_out8(0x20, 0x11);
    io_out8(0x21, 0x20);
    io_out8(0x21, 0x04);
    io_out8(0x21, 0x01);

    // 3. 初始化 8259A 从芯片的 ICW1-4 寄存器
    io_out8(0xa0, 0x11);
    io_out8(0xa1, 0x28);
    io_out8(0xa1, 0x02);
    io_out8(0xa1, 0x01);

    // 4. 初始化 8259A 主芯片的 OCW 寄存器
    io_out8(0x21, 0xfd);
    io_out8(0xa1, 0xff);

    // 5. 开中断
    sti();

}


void doIRQ(unsigned long regs, unsigned long nr) {

    unsigned char x;

    printfColor(RED, BLACK, "doIRQ:%#08x\t", nr);

    // 从对应端口取出来键盘输入的数据
    x = io_in8(0x60);
    printfColor(RED, BLACK, "key code:%#08x\n", x);

    // 通知可以继续了
    io_out8(0x20, 0x20);

}